﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace NAVE_Alice_demo.Cena08.Cena.Camada
{
    /// <summary>
    /// Classe que gerencia camadas
    /// </summary>
    abstract class Camada
    {
        #region Variáveis

        /// <summary>
        /// Imagem de fundo da camada
        /// </summary>
        protected Texture2D t2d_imagem;

        /// <summary>
        /// Quadro de corte da imagem
        /// </summary>
        protected Vector2 v2d_posicaoQuadroImagem;
        protected Vector2 v2d_tamanhoQuadroImagem;

        /// <summary>
        /// Velocidade máxima do paralaxe e velocidade atual do paralaxe, respectivamente
        /// </summary>
        protected float flt_velocidadeParalaxeMaxima, flt_velocidadeParalaxeAtual;

        #endregion

        #region Métodos

        /// <summary>
        /// Atualizar posição da camada de acordo com o mouse
        /// </summary>
        /// <param name="gameTime">Tempo de jogo real</param>
        /// <param name="mouse">Estado do mouse</param>
        public virtual void Update(GameTime gametTime, MouseState mouse)
        {
            //Se o mouse estiver no canto esquerdo da janela ...
            if (mouse.X <= 0)
            {
                //... Se o quadro de corte não estiver em seu limite esquerdo... 
                if (v2d_posicaoQuadroImagem.X >= flt_velocidadeParalaxeMaxima)
                    flt_velocidadeParalaxeAtual = -flt_velocidadeParalaxeMaxima; //Muda-se a velocidade atual para a máxima negativa,
                                                                                 //para que o quadro se mova para esquerda
                //...Senão...
                else
                    flt_velocidadeParalaxeAtual = 0; //Muda-se a velocidade atual para zero, para que o quadro fique parado
            }
            //Senão, se o mouse estiver no quanto direito...
            else if (mouse.X >= 900)
            {
                //... Se o quadro de corte não estiver em seu limite direito...
                if (v2d_posicaoQuadroImagem.X < (t2d_imagem.Width - v2d_tamanhoQuadroImagem.X))
                    flt_velocidadeParalaxeAtual = flt_velocidadeParalaxeMaxima;//Muda-se a velocidade atual para a máxima,
                                                                               //para que o quadro se mova para direita
                //...Senão...
                else
                    flt_velocidadeParalaxeAtual = 0;//Muda-se a velocidade atual para zero, para que o quadro fique parado
            }
            //Senão, quer dizer que o mouse está pelo meio da janela e não irá alterar a paralaxe
            else
                flt_velocidadeParalaxeAtual = 0;//Portanto, a velocidade é zero

            //Atualiza-se o quadro de acordo com a velocidade atual
            v2d_posicaoQuadroImagem.X += flt_velocidadeParalaxeAtual;
        }

        /// <summary>
        /// Desenhe
        /// </summary>
        /// <param name="spriteBatch">Desenhar na tela de jogo</param>
        public virtual void  Draw(SpriteBatch spriteBatch)
        {
            //Desenhando o fundo
            spriteBatch.Draw(t2d_imagem, Vector2.Zero, new Rectangle((int)v2d_posicaoQuadroImagem.X, (int)v2d_posicaoQuadroImagem.Y,
                                                                     (int)v2d_tamanhoQuadroImagem.X, (int)v2d_tamanhoQuadroImagem.Y), 
                                                                     Color.White);
        }

        #endregion
    }
}
